package generic06;

import java.util.ArrayList;
import java.util.Collection;

/*
泛型的优点
  1.使用泛型可以将运行时期可能出现的问题（强制转换异常）提升到编译时期
  2.省去强转，可以直接调用集合中元素类型的方法
 */
public class Demo01 {
    public static void main(String[] args) {
        //method01();
        //method02();
        Collection<String> c = new ArrayList<String>();
        c.add("abc");
        c.add("def");
        for (String s : c) {
            System.out.println(s.length());

        }
    }

    private static void method02() {
        Collection<String> c = new ArrayList<String>();
        c.add("abc");
        //c.add(123);  //add方法的形参被确定位String类型，无法添加Integer类型
        for (Object o : c) {
            String str = (String) o;
            System.out.println(str.length());

        }
    }

    private static void method01() {
        Collection c = new ArrayList();//由于接口上的泛型没有指定类型，所有Collection<E> 中的泛型变量被替换为Object类型
        //而我们的add(E e)方法使用到接口上的E 所以add(E e)方法上E也被替换为Object类型
        c.add("abc");
        c.add(123);

        for (Object o : c) {//第一次循环遍历到"abc" Object o = "abc"
                            //第二次循环遍历到 123  Object o = new Integer(123)
            //o.length();
            String str=(String)o;//第一次循环遍历到“abc”  String str = “abc”
                                 //第二次循环遍历到123    String str = new Integer(123);  此时由于String和Integer没有父子关系
                                 //所以  java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String
            System.out.println(str.length());

        }
    }
}
